<?php

	class BoxTab {
		
		public $id;
		/**
		 * A szülő box objektumunk
		 * @var Box
		 */
		public $parentBox;
		public $label;
		public $isDefault;
		/**
		 * ezt örökli a szülőtől
		 * @var string
		 */
		public $langcode;
		
		/**
		 * BoxContentList objektumok id-vel kulcsolt tömbje
		 * @var array
		 */
		public $boxContentLists;
		/**
		 * Melyik a default lista?
		 * @var int
		 */
		public $defaultBoxContentListId;
		
		/**
		 * Rajzoláshoz. Ez az aktuális BoxContentList
		 * @var int
		 */
		public $currentBoxContentListId;
		
		
		
		public function BoxTab($boxTabDBRecord, $_parentBox)
		{
			$this->id = $boxTabDBRecord['id'];
			$this->parentBox = $_parentBox;
			$this->langcode = $_parentBox->langcode;
			$this->label = $boxTabDBRecord['label'];
			$this->isDefault = DBUtil::decodeBooleanFieldValue($boxTabDBRecord['isdefault']);
			
			$this->loadBoxContentListsFromDB();
			
			$this->reloadState();
		}
		
		
		/**
		 * Session-ből visszaolvassa az állapotunkat - azaz melyik content lista az aktív.
		 * Ha még nincs, akkor kiválasztja a defaultot
		 */
		protected function reloadState()
		{
			if(IS_ADMIN_CONTEXT)
				// admin felületen nincs ilyen
				return;
			
			$currentBoxContentListId = FunctionLibrary::getSessionValue("bxt_".$this->langcode."_".$this->id."_lId", null);
			// ezzel a hívással elérjük, hogy ha a lista még nincs beállítva vagy már nem létezik, akkor
			// visszaállunk a default-ra!
			$this->selectContentList($currentBoxContentListId);
		}
		
		/**
		 * Session-be menti az állapotunkat - azaz melyik az aktív lista
		 */
		protected function saveState()
		{
			if(IS_ADMIN_CONTEXT)
				// admin felületen nincs ilyen
				return;
			
			$_SESSION["bxt_".$this->langcode."_".$this->id."_lId"] = $this->currentBoxContentListId;
		}
		
		/**
		 * Kiválasztja az adott content-listát aktívnak a fülön. Ha nincs ilyen lista, akkor a
		 * default-ra áll
		 * 
		 * @param $listId
		 * @return unknown_type
		 */
		public function selectContentList($listId)
		{
			if(is_null($this->getBoxContentList($listId)))
				$listId = $this->defaultBoxContentListId;
				
			// változás?
			if($this->currentBoxContentListId == $listId)
				return;
				
			$this->currentBoxContentListId = $listId;
			$this->saveState();
		}
		
		
		/**
		 * Lép a következő cuccra
		 */
		public function nextElement()
		{
			//$this->selectContentList($this->currentBoxContentListId);
			
			$boxContentListObj = $this->getBoxContentList($this->currentBoxContentListId);
			if(!is_null($boxContentListObj))
				$boxContentListObj->nextElement();
		}

		/**
		 * Lép az előző cuccra
		 */
		public function prevElement()
		{
			//$this->selectContentList($this->currentBoxContentListId);
			
			$boxContentListObj = $this->getBoxContentList($this->currentBoxContentListId);
			if(!is_null($boxContentListObj))
				$boxContentListObj->prevElement();
		}
		
		/**
		 * Lép az első cuccra
		 */
		public function firstElement()
		{
			//$this->selectContentList($this->currentBoxContentListId);
			
			$boxContentListObj = $this->getBoxContentList($this->currentBoxContentListId);
			if(!is_null($boxContentListObj))
				$boxContentListObj->firstElement();
		}

		/**
		 * Lép az utolsó cuccra
		 */
		public function lastElement()
		{
			//$this->selectContentList($this->currentBoxContentListId);
			
			$boxContentListObj = $this->getBoxContentList($this->currentBoxContentListId);
			if(!is_null($boxContentListObj))
				$boxContentListObj->lastElement();
		}

		/**
		 * Megmondja hogy van-e még következő elem
		 * @return boolean
		 */
		public function hasNextElement()
		{
			$boxContentListObj = $this->getBoxContentList($this->currentBoxContentListId);
			if(!is_null($boxContentListObj))
				return $boxContentListObj->hasNextElement();
			
			return false;
		}

		/**
		 * Megmondja hogy van-e még előző elem
		 * @return boolean
		 */
		public function hasPrevElement()
		{
			$boxContentListObj = $this->getBoxContentList($this->currentBoxContentListId);
			if(!is_null($boxContentListObj))
				return $boxContentListObj->hasPrevElement();
			
			return false;
		}
				
		
		
		/**
		 * Megmondja hogy ez a fül aktív-e.
		 * @return boolean
		 */
		public function isActive()
		{
			return ($this->parentBox->currentTabId == $this->id);
		}
		
		/**
		 * Ez a cikk került ki, ehhez kéne szabni a tartalmat.
		 * Ha nincs kint cikk, akkor null érkezik. De súlyokat akkor is kapunk felülről, hogy
		 * a listák tudjanak autoselectelni...
		 * 
		 * @param int $articleId a cikk id-je - ami lehet null ha nincs kint cikk
		 */
		public function initContentForArticle($articleId)
		{
			// ki kell választanunk melyik content listát használjuk!
			$selectedContentListId = $this->defaultBoxContentListId;
			
			// kiválasztjuk amelyiket kell!
			$this->selectContentList($selectedContentListId);
			
			// végig kell futni a listákon és mindegyiknek el kell rendeznie magát - függetlenül
			// attól h éppen melyik az aktív
			foreach($this->boxContentLists as $boxContentListObj)
			{
				$boxContentListObj->initArticleList();
			}
		}
		
		
		/**
		 * HTML generálása. Ez csak a fül html-jét generálja! A content más tészta...
		 * @return string
		 */
		public function generateHtml()
		{
			$tabTpl = BaseSitePage::loadTemplateFile("boxes/box_tab.tpl.html");
			
			$tabTpl->setVariable("tabId", $this->id);
			
			$tabClasses = array();
			if($this->isActive())
			{
				array_push($tabClasses, "active");
				$tabTpl->setVariable("tabLabel", $this->label);
			}
			else
			{
				$tabLink = HydraLinkProvider::getLink("axBoxSwitchTab", array("boxId"=>$this->parentBox->id, "tabId"=>$this->id));
				$labelHtml = "<a href=\"$tabLink\" onclick=\"getBoxContent(this.href); return false;\">$this->label</a>";
				$tabTpl->setVariable("tabLabel", $labelHtml);
			}
			$tabTpl->setVariable("tabClass", implode(" ", $tabClasses));
			
			return $tabTpl->get();
		}
		
		/**
		 * A content HTML forrásának generálása. Ezt az aktív lista adja meg.
		 * 
		 * @return string
		 */
		public function generateContentHtml()
		{
			$html = "";
			
			$boxContentListObj = $this->getBoxContentList($this->currentBoxContentListId);
			if(!is_null($boxContentListObj))
				$html = $boxContentListObj->generateHtml();
				
			return $html;
		}
		
		
		public function loadBoxContentListsFromDB()
		{
			$this->boxContentLists = array();
			$this->defaultBoxContentListId = null;
			
			$contentRecs = SiteDBHelper::getBoxContentLists($this->id);
			if(is_null($contentRecs))
			{
				$msg = "failed to init box-content-list structure of box tab due to db error!";
				Log::error($msg);
				MailHelper::sendAdminMail("box system failed", $msg);
				return;
			}
			
			foreach($contentRecs as $contentRec)
			{
				$contentListObj = BoxContentList::createFromDBRecord($contentRec, $this);
				
				$this->boxContentLists[$contentListObj->id] = $contentListObj;
				if($contentListObj->isDefault)
					$this->defaultBoxContentListId = $contentListObj->id;
			}
		}
		
		/**
		 * Visszaadja az adott id-jű lista elemet ha van vagy null ha nincs
		 * 
		 * @param $listId
		 * @return BoxContentList
		 */
		public function getBoxContentList($listId)
		{
			if(is_null($listId))
				return null;
				
			if(isset($this->boxContentLists[$listId]))
				return $this->boxContentLists[$listId];
				
			return null;
		}
		
		/**
		 * Visszaadja a default BoxContentList objektumot vagy null ha nincs ilyen
		 * @return BoxContentList
		 */
		public function getDefaultBoxContentList()
		{
			if(!is_null($this->defaultBoxContentListId))
				return $this->getBoxContentList($this->defaultBoxContentListId);
				
			return null;
		}
		
		
		/**
		 * Megmondja h az adott cikk használatban van-e a content listákon, és ha igen akkor
		 * mely content listákon
		 * 
		 * @param $articleId
		 * @return array null ha egyetlen listán sincs használatban, amúgy a lista elemek tömbje, melyek használják
		 */
		public function getBoxContentListsWhereArticleIsUsed($articleId)
		{
			$used = array();
			foreach($this->boxContentLists as $contentListObj)
			{
				if($contentListObj->isArticleUsed($articleId))
					array_push($used, $contentListObj);
			}
			
			if(count($used) == 0)
				return null;
				
			return $used;
		}
		
		/**
		 * Megmondja hogy van-e akár egyetlen content list is ami használja az adott cikket avagy nem
		 * 
		 * @param $articleId
		 * @return boolean
		 */
		public function isArticleUsed($articleId)
		{
			foreach($this->boxContentLists as $contentListObj)
			{
				if($contentListObj->isArticleUsed($articleId))
					return true;
			}
			
			return false;
		}
		
	
	}
?>